 /*******************************************************************************
  * Copyright (c) 2004, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.ui.internal.intro.universal.util;

 import org.eclipse.core.runtime.ILog;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.MultiStatus;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.ui.internal.intro.universal.IUniversalIntroConstants;
 import org.eclipse.ui.internal.intro.universal.UniversalIntroPlugin;

 /**
  * Utility class for logging, based on Platform logging classes. The log
  * listerner used is the base one supplied by the platform. Error messages are
  * always logged. Warning messages are only logged when the plugin is in debug
  * mode. Info messages are only logged when the /trace/logInfo debug option is
  * set to true. Performance reports are only logged when /trace/performance is
  * set to true.
  *
  */
 public class Log implements IUniversalIntroConstants {

     /**
      * This MUST be set to <b>false </b> in production. <br>
      * Used to compile out developement debug messages. <br>
      * Compiler compiles out code warpped wit this flag as an optimization.
      */
     public static final boolean DEBUG = false;


     // Use these flags to filter out code that may be a performance hit.
 // Flag that controls logging of warning message
 public static boolean logWarning = false;
     // Flag that controls logging of information messages
 public static boolean logInfo = false;
     // Flag that controls logging of performance messages
 public static boolean logPerformance = false;

     private final static ILog pluginLog = UniversalIntroPlugin.getDefault().getLog();

     static {
         // init debug options based on settings defined in ".options" file. If
 // the plugin is not in debug mode, no point setting debug options.
 if (UniversalIntroPlugin.getDefault().isDebugging()) {
             logWarning = true;
             logInfo = getDebugOption("/trace/logInfo"); //$NON-NLS-1$
 logPerformance = getDebugOption("/trace/logPerformance"); //$NON-NLS-1$
 }

     }

     private static boolean getDebugOption(String option) {
         return "true".equalsIgnoreCase(//$NON-NLS-1$
 Platform.getDebugOption(PLUGIN_ID + option));
     }

     /**
      * Log an Error message with an exception. Note that the message should
      * already be localized to proper local. Errors are always logged.
      */
     public static synchronized void error(String message, Throwable ex) {
         if (message == null)
             message = ""; //$NON-NLS-1$
 Status errorStatus = new Status(IStatus.ERROR, PLUGIN_ID, IStatus.OK,
             message, ex);
         pluginLog.log(errorStatus);
     }

     /**
      * Log an Information message. Note that the message should already be
      * localized to proper local. Info messages are only logged when the
      * /trace/logInfo debug option is true.
      */
     public static synchronized void info(String message) {
         if (!logInfo)
             // logging of info messages is not enabled.
 return;

         if (message == null)
             message = ""; //$NON-NLS-1$
 Status infoStatus = new Status(IStatus.INFO, PLUGIN_ID, IStatus.OK,
             message, null);
         pluginLog.log(infoStatus);
     }

     /**
      * Log an Information message. Note that the message should already be
      * localized to proper local. These messages are always logged. They are not
      * controlled by any debug flags. Logging of these messages can be
      * controlled by the public flags in this class.
      */
     public static synchronized void forcedInfo(String message) {
         if (message == null)
             message = ""; //$NON-NLS-1$
 Status infoStatus = new Status(IStatus.INFO, PLUGIN_ID, IStatus.OK,
             message, null);
         pluginLog.log(infoStatus);
     }


     /**
      * Log a Warning message. Note that the message should already be localized
      * to proper local. Warning messages are only logged when the plugin is in
      * debug mode.
      */
     public static synchronized void warning(String message) {
         if (!logWarning)
             // no warning messages (ie: plugin is not in debug mode). Default is
 // to not log warning messages.
 return;

         if (message == null)
             message = ""; //$NON-NLS-1$
 Status warningStatus = new Status(IStatus.WARNING, PLUGIN_ID,
             IStatus.OK, message, null);
         pluginLog.log(warningStatus);
     }

     /**
      * Log a development debug message. Debug messages are compiled out.
      */
     public static synchronized void debugMessage(String className,
             String message) {
         if (DEBUG) {
             MultiStatus debugStatus = new MultiStatus(PLUGIN_ID, IStatus.OK,
                 className, null);
             Status infoStatus = new Status(IStatus.OK, PLUGIN_ID, IStatus.OK,
                 message, null);
             debugStatus.add(infoStatus);
             pluginLog.log(debugStatus);
         }
     }
 }

